import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import { createServerClient } from '@supabase/ssr';
import createIntlMiddleware from 'next-intl/middleware';

// 创建国际化中间件
const intlMiddleware = createIntlMiddleware({
  // 支持的语言列表
  locales: ['en', 'zh'],

  // 默认语言
  defaultLocale: 'en',

  // 禁用浏览器语言偏好检测
  localeDetection: false,

  // 如果访问的路径没有语言前缀，则重定向到默认语言
  localePrefix: 'as-needed'
});

// 不需要认证的路由路径前缀
const publicRoutes = ['/auth'];

export async function middleware(request: NextRequest) {
  // 首先应用国际化中间件
  const intlResponse = intlMiddleware(request);
  const pathname = request.nextUrl.pathname;

  // 检查是否是公开路由（不需要认证）
  const isPublicRoute = publicRoutes.some(route =>
    pathname.includes(`/${request.nextUrl.locale}${route}`) ||
    pathname.includes(route)
  );

  // 如果是公开路由，直接返回国际化中间件的响应
  if (isPublicRoute) {
    return intlResponse;
  }

  // 创建 Supabase 客户端
  const res = NextResponse.next();

  // 使用最新推荐的 createServerClient API
  const supabase = createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      // 使用最新推荐的 cookie 处理方式
      cookies: {
        getAll() {
          return Array.from(request.cookies.getAll()).map(cookie => ({
            name: cookie.name,
            value: cookie.value,
          }));
        },
        setAll(cookieValues) {
          cookieValues.forEach(({ name, value, ...options }) => {
            request.cookies.set({
              name,
              value,
              ...options,
            });
            res.cookies.set({
              name,
              value,
              ...options,
            });
          });
        },
      },
    }
  );

  // 验证会话
  const { data: { session } } = await supabase.auth.getSession();

  // 如果没有有效会话且访问的不是公开路由，则重定向到认证页面
  if (!session) {
    // 获取当前语言
    const locale = request.nextUrl.locale || 'en';

    // 重定向到认证页面，保留当前语言
    const redirectUrl = new URL(`/${locale}/auth`, request.url);
    return NextResponse.redirect(redirectUrl);
  }

  // 返回国际化中间件的响应
  return intlResponse;
}

export const config = {
  // 匹配所有路径，除了api路由、静态文件等
  matcher: ['/((?!api|_next|.*\\..*).*)']
};
